JavaScriptã®ã¯ããŒãžã£ãŒã®é«åºŠãªæŠå¿µãæ¢æ±ããã¡ã¢ãªç®¡çãžã®åœ±é¿ãšãã¹ã³ãŒããã©ã®ããã«ä¿æãããããå®äŸãšãã¹ããã©ã¯ãã£ã¹ãçšããŠè§£èª¬ããŸãã
JavaScriptã®ã¯ããŒãžã£ãŒé«åºŠãªæŽ»çšïŒã¡ã¢ãªç®¡çãšã¹ã³ãŒãã®ä¿æ
JavaScriptã®ã¯ããŒãžã£ãŒã¯ãåºæ¬çãªæŠå¿µã§ãããå€ãã®å Žåã颿°ããå€éšã®ã¹ã³ãŒããã倿°ã«ã¢ã¯ã»ã¹ããããããèšæ¶ãããèœåãšããŠèª¬æãããŸããå€éšé¢æ°ãå®è¡ãçµäºããåŸã§ãããã®èœåãä¿æãããŸãããã®äžèŠåçŽãªã¡ã«ããºã ã¯ãã¡ã¢ãªç®¡çã«å€§ããªåœ±é¿ãäžãã匷åãªããã°ã©ãã³ã°ãã¿ãŒã³ãå¯èœã«ããŸãããã®èšäºã§ã¯ãã¯ããŒãžã£ãŒã®é«åºŠãªåŽé¢ãæãäžããã¡ã¢ãªãžã®åœ±é¿ãšã¹ã³ãŒãä¿æã®è€éããæ¢æ±ããŸãã
ã¯ããŒãžã£ãŒã®çè§£ïŒåŸ©ç¿
é«åºŠãªæŠå¿µã«å ¥ãåã«ãã¯ããŒãžã£ãŒãäœã§ããããç°¡åã«åŸ©ç¿ããŸããããæ¬è³ªçã«ãã¯ããŒãžã£ãŒã¯ã颿°ãå€éšïŒå²ãã§ããïŒé¢æ°ã®ã¹ã³ãŒããã倿°ã«ã¢ã¯ã»ã¹ãããã³ã«äœæãããŸããã¯ããŒãžã£ãŒã䜿çšãããšãå€éšé¢æ°ãæ»ã£ãåŸã§ããå éšé¢æ°ã¯ãããã®å€æ°ã«ã¢ã¯ã»ã¹ãç¶ããããšãã§ããŸããããã¯ãå éšé¢æ°ãå€éšé¢æ°ã®åå¥çç°å¢ãžã®åç §ãç¶æããŠããããã§ãã
åå¥çç°å¢ïŒåå¥çç°å¢ãã颿°ã®äœææã«ãã¹ãŠã®å€æ°ãšé¢æ°å®£èšãä¿æããããããšèããŠãã ãããã¹ã³ãŒãã®ã¹ãããã·ã§ããã®ãããªãã®ã§ãã
ã¹ã³ãŒããã§ãŒã³ïŒé¢æ°å ã§å€æ°ã«ã¢ã¯ã»ã¹ããå ŽåãJavaScriptã¯æåã«ãã®é¢æ°ã®ç¬èªã®åå¥çç°å¢ã§ãããæ€çŽ¢ããŸããèŠã€ãããªãå Žåã¯ãã¹ã³ãŒããã§ãŒã³ããã©ããå€éšé¢æ°ã®åå¥çç°å¢ãæ€çŽ¢ããŠãã°ããŒãã«ã¹ã³ãŒãã«å°éããŸãããã®åå¥çç°å¢ã®ãã§ãŒã³ã¯ãã¯ããŒãžã£ãŒã«ãšã£ãŠéèŠã§ãã
ã¯ããŒãžã£ãŒãšã¡ã¢ãªç®¡ç
ã¯ããŒãžã£ãŒã®æãéèŠã§ãèŠéããããã¡ãªåŽé¢ã®1ã€ã¯ãã¡ã¢ãªç®¡çãžã®åœ±é¿ã§ããã¯ããŒãžã£ãŒã¯åšå²ã®ã¹ã³ãŒãå ã®å€æ°ãžã®åç §ãç¶æãããããã¯ããŒãžã£ãŒãååšããéãããããã®å€æ°ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã§ããŸããããããæ³šææ·±ãåŠçããªããšãã¡ã¢ãªãªãŒã¯ã«ã€ãªããå¯èœæ§ããããŸããäŸãæããŠèª¬æããŸãããã
æå³ããªãã¡ã¢ãªä¿æã®åé¡
ãã®äžè¬çãªã·ããªãªãèããŠã¿ãŸãããã
function outerFunction() {
let largeData = new Array(1000000).fill('some data'); // Large array
let innerFunction = function() {
console.log('Inner function accessed.');
};
return innerFunction;
}
let myClosure = outerFunction();
// outerFunction has finished, but myClosure still exists
ãã®äŸã§ã¯ã`largeData`ã¯`outerFunction`å ã§å®£èšããã倧ããªé åã§ãã`outerFunction`ã®å®è¡ãå®äºããŠãã`myClosure`ïŒ`innerFunction`ãåç §ïŒã¯ã`largeData`ãå«ã`outerFunction`ã®åå¥çç°å¢ãžã®åç §ãä¿æããŠããŸãããã®çµæã`largeData`ã¯ãã¢ã¯ãã£ãã«äœ¿çšãããŠããªãå¯èœæ§ãããã«ãããããããã¡ã¢ãªã«æ®ããŸããããã¯æœåšçãªã¡ã¢ãªãªãŒã¯ã§ãã
ãªããããèµ·ããã®ãïŒJavaScriptãšã³ãžã³ã¯ãäžèŠã«ãªã£ãã¡ã¢ãªãèªåçã«åå©çšããããã«ã¬ããŒãžã³ã¬ã¯ã¿ãŒã䜿çšããŸãããã ããã¬ããŒãžã³ã¬ã¯ã¿ãŒã¯ããªããžã§ã¯ããã«ãŒãïŒã°ããŒãã«ãªããžã§ã¯ãïŒããå°éã§ããªããªã£ãå Žåã«ã®ã¿ã¡ã¢ãªãåå©çšããŸãããã®å Žåã`largeData`ã¯`myClosure`倿°ãéããŠå°éã§ãããããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã劚ããããŸãã
ã¯ããŒãžã£ãŒã§ã®ã¡ã¢ãªãªãŒã¯ã®è»œæž
ã¯ããŒãžã£ãŒã«ãã£ãŠçºçããã¡ã¢ãªãªãŒã¯ã軜æžããããã®ããã€ãã®æŠç¥ã以äžã«ç€ºããŸãã
- åç
§ã®ç¡å¹åïŒã¯ããŒãžã£ãŒãäžèŠã«ãªã£ãããšãããã£ãŠããå Žåã¯ãã¯ããŒãžã£ãŒå€æ°ãæç€ºçã«`null`ã«èšå®ã§ããŸããããã«ãããåç
§ãã§ãŒã³ãäžæãããã¬ããŒãžã³ã¬ã¯ã¿ãŒãã¡ã¢ãªãåå©çšã§ããããã«ãªããŸãã
myClosure = null; // Break the reference - ã¹ã³ãŒãã®æ³šææ·±ãèšå®ïŒäžå¿
èŠã«å€§éã®ããŒã¿ããã£ããã£ããã¯ããŒãžã£ãŒã®äœæãé¿ããŠãã ãããã¯ããŒãžã£ãŒãããŒã¿ã®ã»ãã®äžéšããå¿
èŠãšããªãå Žåã¯ãã¯ããŒãžã£ãŒãã¹ã³ãŒãå
šäœã«ã¢ã¯ã»ã¹ããããšã«äŸåãã代ããã«ããã®äžéšãåŒæ°ãšããŠæž¡ããŠã¿ãŠãã ããã
function outerFunction(dataNeeded) { let innerFunction = function() { console.log('Inner function accessed with:', dataNeeded); }; return innerFunction; } let largeData = new Array(1000000).fill('some data'); let myClosure = outerFunction(largeData.slice(0, 100)); // Pass only a portion - `let`ãš`const`ã®äœ¿çšïŒ`var`ã®ä»£ããã«`let`ãš`const`ã䜿çšãããšã倿°ã®ã¹ã³ãŒããæžããããšãã§ããã¬ããŒãžã³ã¬ã¯ã¿ãŒã倿°ãäžèŠã«ãªã£ãææã倿ãããããªããŸãã
- Weak MapãšWeak Setã®äœ¿çšïŒãããã®ããŒã¿æ§é ã䜿çšãããšãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãé²ãããšãªãããªããžã§ã¯ããžã®åç §ãä¿æã§ããŸãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãWeakMapãŸãã¯WeakSetã®åç §ã¯èªåçã«åé€ãããŸããããã¯ãã¡ã¢ãªãªãŒã¯ã«è²¢ç®ããªãæ¹æ³ã§ããªããžã§ã¯ããšããŒã¿ãé¢é£ä»ããå Žåã«åœ¹ç«ã¡ãŸãã
- é©åãªã€ãã³ããªã¹ããŒç®¡çïŒWebéçºã§ã¯ãã¯ããŒãžã£ãŒã¯ã€ãã³ããªã¹ããŒãšãšãã«äœ¿çšãããããšããããããŸããã¡ã¢ãªãªãŒã¯ãé²ãããã«ãäžèŠã«ãªã£ããšãã«ã€ãã³ããªã¹ããŒãåé€ããããšãéèŠã§ããããšãã°ãåŸã§DOMããåé€ãããDOMèŠçŽ ã«ã€ãã³ããªã¹ããŒãã¢ã¿ããããå Žåãæç€ºçã«åé€ããªãéããã€ãã³ããªã¹ããŒïŒããã³é¢é£ããã¯ããŒãžã£ãŒïŒã¯ã¡ã¢ãªã«æ®ããŸãã`removeEventListener`ã䜿çšããŠããªã¹ããŒããã¿ããããŸãã
element.addEventListener('click', myClosure); // Later, when the element is no longer needed: element.removeEventListener('click', myClosure); myClosure = null;
å®éã®äŸïŒåœéåïŒi18nïŒã©ã€ãã©ãª
ãã±ãŒã«åºæã®ããŒã¿ãæ ŒçŽããããã«ã¯ããŒãžã£ãŒã䜿çšããåœéåã©ã€ãã©ãªãèããŠã¿ãŸããããã¯ããŒãžã£ãŒã¯ããã®ããŒã¿ãã«ãã»ã«åããŠã¢ã¯ã»ã¹ããã®ã«å¹ççã§ãããäžé©åãªç®¡çã¯ãç¹ã«ãã±ãŒã«ãé »ç¹ã«åãæ¿ããããã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ïŒSPAïŒã§ã¡ã¢ãªãªãŒã¯ãåŒãèµ·ããå¯èœæ§ããããŸãããã±ãŒã«ãäžèŠã«ãªã£ãå Žåã¯ãäžèšã®ããããã®ææ³ã䜿çšããŠãé¢é£ããã¯ããŒãžã£ãŒïŒããã³ãã®ãã£ãã·ã¥ããŒã¿ïŒãé©åã«è§£æŸããŠãã ããã
ã¹ã³ãŒãã®ä¿æãšé«åºŠãªãã¿ãŒã³
ã¡ã¢ãªç®¡çãè¶ ããŠãã¯ããŒãžã£ãŒã¯åŒ·åãªããã°ã©ãã³ã°ãã¿ãŒã³ãäœæããããã«äžå¯æ¬ ã§ããããŒã¿ã«ãã»ã«åããã©ã€ããŒã倿°ãã¢ãžã¥ãŒã«åãªã©ã®ææ³ãå¯èœã«ããŸãã
ãã©ã€ããŒã倿°ãšããŒã¿ã«ãã»ã«å
JavaScriptã«ã¯ãJavaãC++ãªã©ã®èšèªãšåæ§ã«ããã©ã€ããŒã倿°ã®æç€ºçãªãµããŒãã¯ãããŸããããã ããã¯ããŒãžã£ãŒã¯ã颿°ã¹ã³ãŒãå ã«ã«ãã»ã«åããããšã«ããããã©ã€ããŒã倿°ãã·ãã¥ã¬ãŒãããæ¹æ³ãæäŸããŸããå€éšé¢æ°å ã§å®£èšããã倿°ã¯ãå éšé¢æ°ã®ã¿ãã¢ã¯ã»ã¹ã§ãã广çã«ãã©ã€ããŒãã«ãªããŸãã
function createCounter() {
let count = 0; // Private variable
return {
increment: function() {
count++;
return count;
},
decrement: function() {
count--;
return count;
},
getCount: function() {
return count;
}
};
}
let counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.decrement()); // 0
console.log(counter.getCount()); // 0
//count; // Error: count is not defined
ãã®äŸã§ã¯ã`count`ã¯`createCounter`ã®ã¹ã³ãŒãå ã§ã®ã¿ã¢ã¯ã»ã¹ã§ãããã©ã€ããŒã倿°ã§ããè¿ããããªããžã§ã¯ãã¯ã`count`ã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããã¡ãœããïŒ`increment`ã`decrement`ã`getCount`ïŒãå ¬éããŸããã`count`èªäœã¯`createCounter`颿°ã®å€éšããçŽæ¥ã¢ã¯ã»ã¹ã§ããŸãããããã«ãããããŒã¿ãã«ãã»ã«åãããæå³ããªã倿Žã鲿¢ãããŸãã
ã¢ãžã¥ãŒã«ãã¿ãŒã³
ã¢ãžã¥ãŒã«ãã¿ãŒã³ã¯ãã¯ããŒãžã£ãŒã掻çšããŠããã©ã€ããŒãç¶æ ãšãããªãã¯APIãåããèªå·±å®çµåã®ã¢ãžã¥ãŒã«ãäœæããŸããããã¯ãJavaScriptã³ãŒããæŽçããã¢ãžã¥ãŒã«æ§ãä¿é²ããããã®åºæ¬çãªãã¿ãŒã³ã§ãã
let myModule = (function() {
let privateVariable = 'Secret';
function privateMethod() {
console.log('Inside privateMethod:', privateVariable);
}
return {
publicMethod: function() {
console.log('Inside publicMethod.');
privateMethod(); // Accessing private method
}
};
})();
myModule.publicMethod(); // Output: Inside publicMethod.
// Inside privateMethod: Secret
//myModule.privateMethod(); // Error: myModule.privateMethod is not a function
//console.log(myModule.privateVariable); // undefined
ã¢ãžã¥ãŒã«ãã¿ãŒã³ã¯ã峿åŒã³åºã颿°åŒïŒIIFEïŒã䜿çšããŠãã©ã€ããŒãã¹ã³ãŒããäœæããŸããIIFEå ã§å®£èšããã倿°ãšé¢æ°ã¯ãã¢ãžã¥ãŒã«ã«å¯ŸããŠãã©ã€ããŒãã§ããã¢ãžã¥ãŒã«ã¯ããããªãã¯APIãå ¬éãããªããžã§ã¯ããè¿ããã¢ãžã¥ãŒã«ã®æ©èœãžã®å¶åŸ¡ãããã¢ã¯ã»ã¹ãå¯èœã«ããŸãã
ã«ãªãŒåãšéšåé©çš
ã¯ããŒãžã£ãŒã¯ãã³ãŒãã®åå©çšæ§ãšæè»æ§ãé«ãã颿°åããã°ã©ãã³ã°ææ³ã§ããã«ãªãŒåãšéšåé©çšãå®è£ ããããã«ãéèŠã§ãã
ã«ãªãŒåïŒã«ãªãŒåã¯ãè€æ°ã®åŒæ°ãåã颿°ãããããããåäžã®åŒæ°ãåã颿°ã®ã·ãŒã±ã³ã¹ã«å€æããŸããå颿°ã¯ããã¹ãŠã®åŒæ°ãæäŸããããŸã§ã次ã®åŒæ°ãæåŸ ããå¥ã®é¢æ°ãè¿ããŸãã
function multiply(a) {
return function(b) {
return function(c) {
return a * b * c;
};
};
}
let multiplyBy5 = multiply(5);
let multiplyBy5And6 = multiplyBy5(6);
let result = multiplyBy5And6(7);
console.log(result); // Output: 210
ãã®äŸã§ã¯ã`multiply`ã¯ã«ãªãŒåããã颿°ã§ããåãã¹ãããã颿°ã¯ãå€éšé¢æ°ã®åŒæ°ãã¯ããŒãžã£ãŒãããã¹ãŠã®åŒæ°ãå©çšå¯èœã«ãªã£ããšãã«æçµçãªèšç®ãå®è¡ã§ããããã«ããŸãã
éšåé©çšïŒéšåé©çšã«ã¯ã颿°ã®åŒæ°ã®ããã€ããäºåã«å ¥åããåŒæ°ã®æ°ãå°ãªãæ°ãã颿°ãäœæããããšãå«ãŸããŸãã
function greet(greeting, name) {
return greeting + ', ' + name + '!';
}
function partial(func, arg1) {
return function(arg2) {
return func(arg1, arg2);
};
}
let greetHello = partial(greet, 'Hello');
let message = greetHello('World');
console.log(message); // Output: Hello, World!
ããã§ã`partial`ã¯ã`greet`颿°ã®`greeting`åŒæ°ãäºåã«å ¥åããããšã«ãããæ°ãã颿°`greetHello`ãäœæããŸããã¯ããŒãžã£ãŒã䜿çšãããšã`greetHello`ã¯`greeting`åŒæ°ããèšæ¶ãã§ããŸãã
ã€ãã³ããã³ããªã³ã°ã§ã®ã¯ããŒãžã£ãŒ
åè¿°ã®ããã«ãã¯ããŒãžã£ãŒã¯ã€ãã³ããã³ããªã³ã°ã§é »ç¹ã«äœ¿çšãããŸããããã«ãããè€æ°ã®ã€ãã³ãçºçã«ããã£ãŠæ°žç¶ããããŒã¿ãã€ãã³ããªã¹ããŒã«é¢é£ä»ããããšãã§ããŸãã
function createButton(label, callback) {
let button = document.createElement('button');
button.textContent = label;
button.addEventListener('click', function() {
callback(label); // Closure over 'label'
});
document.body.appendChild(button);
}
createButton('Click Me', function(label) {
console.log('Button clicked:', label);
});
`addEventListener`ã«æž¡ãããå¿å颿°ã¯ã`label`倿°ã«å¯ŸããŠã¯ããŒãžã£ãŒãäœæããŸããããã«ããããã¿ã³ãã¯ãªãã¯ããããšãã«ãæ£ããã©ãã«ãã³ãŒã«ããã¯é¢æ°ã«æž¡ãããŸãã
ã¯ããŒãžã£ãŒã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
- ã¡ã¢ãªäœ¿çšéãæèããïŒåžžã«ã¯ããŒãžã£ãŒã®ã¡ã¢ãªãžã®åœ±é¿ãèæ ®ããŠãã ãããç¹ã«ã倧éã®ããŒã¿ãæ±ãå Žåã¯æ³šæãå¿ èŠã§ãã以åã«èª¬æããææ³ã䜿çšããŠãã¡ã¢ãªãªãŒã¯ãé²ããŸãã
- ã¯ããŒãžã£ãŒãæå³çã«äœ¿çšããïŒäžå¿ èŠã«ã¯ããŒãžã£ãŒã䜿çšããªãã§ãã ãããã¯ããŒãžã£ãŒãäœæããã«ãåçŽãªé¢æ°ã§ç®çã®çµæãéæã§ããå Žåã¯ããããããè¯ãã¢ãããŒãã§ããããšããããããŸãã
- ã¯ããŒãžã£ãŒãææžåããïŒã¯ããŒãžã£ãŒãè€éãªå Žåã¯ç¹ã«ãã¯ããŒãžã£ãŒã®ç®çãå¿ ãææžåããŠãã ãããããã«ãããä»ã®éçºè ïŒããã³å°æ¥ã®ããªãèªèº«ïŒãã³ãŒããçè§£ããæœåšçãªåé¡ãåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
- ã³ãŒãã培åºçã«ãã¹ãããïŒã¯ããŒãžã£ãŒã䜿çšããã³ãŒãã培åºçã«ãã¹ãããŠãäºæãããšããã«åäœããã¡ã¢ãªãªãŒã¯ãçºçããªãããšã確èªããŠãã ããããã©ãŠã¶ã®éçºè ããŒã«ãŸãã¯ã¡ã¢ãªãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã¡ã¢ãªäœ¿çšéãåæããŸãã
- ã¹ã³ãŒããã§ãŒã³ãçè§£ããïŒã¯ããŒãžã£ãŒã广çã«äœ¿çšããã«ã¯ãã¹ã³ãŒããã§ãŒã³ããã£ãããšçè§£ããããšãäžå¯æ¬ ã§ãã倿°ã®ã¢ã¯ã»ã¹æ¹æ³ãšãã¯ããŒãžã£ãŒãåšå²ã®ã¹ã³ãŒããžã®åç §ãã©ã®ããã«ç¶æããããèŠèŠåããŸãã
çµè«
JavaScriptã®ã¯ããŒãžã£ãŒã¯ãããŒã¿ã«ãã»ã«åãã¢ãžã¥ãŒã«æ§ãããã³é¢æ°åããã°ã©ãã³ã°ææ³ãªã©ã®é«åºŠãªããã°ã©ãã³ã°ãã¿ãŒã³ãå¯èœã«ãã匷åã§çšéã®åºãæ©èœã§ãããã ããã¡ã¢ãªãæ³šææ·±ã管çãã責任ã䌎ããŸããã¯ããŒãžã£ãŒã®è€éããã¡ã¢ãªç®¡çãžã®åœ±é¿ãããã³ã¹ã³ãŒãä¿æã«ããã圹å²ãçè§£ããããšã«ãããéçºè ã¯æœåšçãªèœãšã穎ãåé¿ããªããããã®æœåšèœåãæå€§éã«æŽ»çšã§ããŸããã¯ããŒãžã£ãŒããã¹ã¿ãŒããããšã¯ãçç·ŽããJavaScriptéçºè ã«ãªããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®å ç¢ã§ã¹ã±ãŒã©ãã«ã§ä¿å®å¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªã¹ãããã§ãã